local respond_to        = require("lapis.application").respond_to
local csrf_tool         = require("utils.csrf_tool")
local capture_errors    = require("lapis.application").capture_errors
local object            = require("controllers.blogController")
local max_articles_size = require("utils.website_config").max_articles_size

return respond_to({
	GET = function(self)
		if self.session.user then
			self.head_title = "Publica un artículo en "..require("utils.website_config").website_name

			-- Genera un token contra ataques CSRF con tiempo de expiración.
			self.csrf_token = csrf_tool.generate_token(self)

			self.max_articles_size = max_articles_size

			if self.session.message then
				self.message         = self.session.message
				self.session.message = nil
			end

			return { render = "pages.upload_article" }
		else
			return { redirect_to = self:url_for("index") }
		end
	end,
	POST = capture_errors({
		-- Captura y muestra fallos (excepciones) dentro de una plantilla.
		on_error = require('utils.errors'),
		function(self)
			if self.session.user then
				-- Autentifica y valida el tiempo de expiración del token.
				csrf_tool.validation_token(self)

				-- Selecciona los campos de un formulario que solo son necesarios y
				-- elimina espacios sobrantes de inicio y fin.
				local inputs_form = { "title", "synopsis", "content" }
							
				local trim = require("lapis.util").trim
				local data = {}

				for index,input in ipairs(inputs_form) do
					data[input] = trim(self.params[input])
				end

				-- Valida los campos de un formulario.			
				local validate = require("utils.validate")

				validate.assert_valid(data, {
					{ "title",    exists = true, min_length = 1, max_length = 243,               type = "string" },
					{ "synopsis", exists = true, min_length = 1, max_length = 255,               type = "string" },
					{ "content",  exists = true, min_length = 1, max_length = max_articles_size, type = "string" }
				})

				-- id del usuario quien sube el artículo.
				data.user_id = self.session.user.id

				-- Almacena un artículo en espera de aprobación.
				self.session.message = object:blogUpload(data)

				return { redirect_to = self:url_for("upload_article") }
			else
				return { redirect_to = self:url_for("index") }
			end
		end
	})
})